home *** CD-ROM | disk | FTP | other *** search
- #include "sortdata.h"
-
- typedef struct {
- long* sortdata;
- swp sw;
- short *stopflag;
- cmp cm;
- long sp;
- long sep;
- long *plv;
- long *phv;
- } quicker_static, *pquicker_static;
-
- void main(long maxdata, long* sortdata, swp sw, cmp cm, short* stopflag);
- pascal void doquicker(long startvalue, long endvalue, pquicker_static quickptr);
-
- void main(long maxdata, long* sdata, swp swpf, cmp cmpf, short* stflag)
- {
- quicker_static quick;
-
-
- quick.sortdata = sdata;
- quick.sw = swpf;
- quick.cm = cmpf;
- quick.stopflag = stflag;
- doquicker(0, maxdata -1, &quick);
- }
-
- pascal void doquicker(long startvalue, long endvalue, pquicker_static quickptr)
- {
- long lv,hv;
-
- lv = startvalue;
- hv = endvalue;
-
- quickptr->plv = &(quickptr->sortdata[lv]);
- quickptr->phv = &(quickptr->sortdata[hv]);
- quickptr->sp = (startvalue+endvalue)>>1;
- quickptr->sep = quickptr->sortdata[quickptr->sp];
-
- do {
- while ((lv != quickptr->sp) && ((*(quickptr->cm))(lv, quickptr->sp, *(quickptr->plv), quickptr->sep) < 0)) {
- if (*(quickptr->stopflag)) {
- return;
- }
- lv++;
- quickptr->plv++;
- }
-
- while ((hv != quickptr->sp) && ((*(quickptr->cm))(hv, quickptr->sp, *(quickptr->phv), quickptr->sep) > 0)) {
- if (*(quickptr->stopflag)) {
- return;
- }
- hv--;
- quickptr->phv--;
- }
-
- if (lv <= hv) {
- if ((*(quickptr->cm))(lv, hv, *(quickptr->plv), *(quickptr->phv)) > 0) {
- (*(quickptr->sw))(lv, hv, quickptr->plv, quickptr->phv);
- }
- lv++;
- quickptr->plv++;
- hv--;
- quickptr->phv--;
- }
- } while (lv <= hv);
-
- if (startvalue < hv) {
- doquicker(startvalue, hv, quickptr);
- }
-
- if (endvalue > lv) {
- doquicker(lv, endvalue, quickptr);
- }
- }
-
-